home *** CD-ROM | disk | FTP | other *** search
- {$A+,B-,D-,E-,F+,G+,I-,L-,N-,O-,R-,S-,V+,X-}
-
- { Manejador del controlador XMS (c) Emilio David Diaus 1994 }
- { Manejador de EMB Bloques de memoria extendida o ampliada }
- { Funciona con driver 2.0 o superior }
- {
- 5. Mxms: Acceso A La Memoria Extendida Mediante Un
- Gestor De Memoria
-
- A TravéS De Este MóDulo Podremos Controlar La Memoria Extendida
- Y Mover Bloques De Memoria De La Memoria Convencional A La
- Memoria Extendida Y Viceversa, La RealizacióN De Estos Programas
- En Lenguaje Pascal O C Necesita O Bien De Un Ensamblador Como
- Turbo Assembler O Ms-Assembler O Utilizar Los Servicios Que
- Proporcionan Estos Lenguajes Para Compilar Instrucciones En
- Ensamblador Dentro De Un Fichero De CóDigo Fuente Pascal O C ,
- Este Procedimiento TambiéN Se Puede Desarrollar De Dos Maneras:
- Utilizando La FuncióN Inline Que Permite Introducir Los CóDigos
- De Las Rutinas En Ensamblador O Bien Introducir Directamente Las
- Instrucciones De Lenguaje Maquina En El Programa A TravéS De Asm,
- Independientemente Del MéTodo Elegido, En Lenguaje C Se Suele
- Producir La Llamada En El Momento De La CompilacióN A Un
- Ensamblador Para Que Genere El CóDigo Objeto Que Luego Se
- Enlazara Con Los DemáS MóDulos De Nuestro Programa.
-
- Habitualmente Se Utiliza Para Las Llamadas A Estas Funciones El
- EstáNdar Xms VersióN 2.0 O Superior, Este Es El NúMero De Versión
- MíNimo Necesario Para Que El MóDulo Xms.Pas Funcione.
-
- Procedimientos Del MαDulo
-
-
- Podemos Clasificar Los Procedimientos De Este MóDulo En
- Varias CategoríAs, Los De InformacióN, PeticióN Y LiberacióN De
- Memoria, Movimiento De Bloques De Esta E InicializacióN y
- FinalizacióN De La GestióN De Memoria, En Cuanto A La Utilización
- CronolóGica Los Podemos Dividir Así:
-
- Procedimientos De Inicialización
-
-
- Function Inicializa_Xms: Boolean;
- Devuelve True O False Dependiendo De Si Se Ha
- Inicializado Correctamente La GestióN De Memoria Xms
- O No.
-
- Procedimientos De BúSqueda De Información
-
-
- Procedure Cantidad_Xms_Libre(Var
- Totalxms,Bloque_Max:Integer);
- Devuelve La Cantidad De Memoria Extendida O Ampliada
- Disponible Y El Bloque Mas Grande De Esta En Kb.
- Procedure Xms_Info( Handle : Integer; Var Lock,
- Akilobytes : Integer;
- Var Freeh : Integer );
- Devuelve InformacióN Sobre Un Bloque
- Determinado De Memoria Extendida
- Identificado Por El NúMero De Handle Que Se
- Pasa En La Variable Handle, Dicho NúMero Se
- Tiene Que Haber Obtenido Mediante La
- EjecucióN Exitosa De La FuncióN Function
- Nuevo_Bloque(Akilobytes:Integer):Integer;
- Que Devuelve El NúMero De Handle Antes
- Aludido.
-
-
- Procedimientos De Manejo De Bloques
-
-
- Function Nuevo_Bloque(Akilobytes:Integer):Integer;
-
- Reserva Un Bloque De Memoria Extendida Identificado
- Por Un Numero Llamado Handle O Manipulador Que Es
- Devuelto Por La FuncióN.
-
- Procedure Dispon_Bloque(Handle:Integer);
-
- Libera Un Bloque De Memoria Extendida Con El NúMero
- Handle.
-
- Function
- Cambiar_Tamano_Bloque(Handle,Nuevos_Kilobytes:Integer):
- Boolean;
-
- Cambia El TamañO De Un Bloque De Memoria Extendida
- Identificado Por La Variable Handle Y De Un Nuevo
- TamañO De Nuevos_Kilobytes En Un Entero.
-
- Procedure Mover_Bloque_Emb(Fhandle:Integer;Foffset:Longint;
- Dhandle:Integer;Doffset:Longint; Longitud:Longint);
-
- Mueve Un Bloque De Memoria Desde Memoria Extendida a
- Convencional Y Viceversa Y Entre Memoria Extendida
- Entre Sí.
-
-
- Function Bloquea_Bloque_Emb( Handle : Integer ) : Longint;
-
- El Gestor De Memoria Xms Maneja La Memoria De Forma
- DináMica Para Que Haya Siempre El Mayor Bloque De
- Memoria Extendida Disponible, Por Esta RazóN Se
- Utilizan Los Handles En Vez De La DireccióN De Los
- Bloques De Memoria Para Operar Con Ellos, Si Se Quiere
- Impedir Que Un Bloque Sea Cambiado En Su DireccióN En
- La Memoria Por El Gestor Se Acude A Esta FuncióN Con
- El NúMero De Handle Del Bloque Correspondiente,
- Devuelve Un Entero De 32 Bits Que Es Su DireccióN En
- La Memoria. (Normalmente A Efectos Meramente
- Informativos ).
-
- Procedure Desbloquea_Bloque_Emb( Handle : Integer );
-
- Permite Que Un Bloque De Memoria Extendida Sea Movido
- Por El Gestor De Memoria Xms.
-
- El Procedimiento De Llamada A Los Servicios Xms Solo Se Puede
- Realizar Con Una Llamada Lejana A Una DireccióN Que Nos Devuelve
- La InterrupcióN Del Multiplexor ( Int 2Fh ), Con El NúMero De
- FuncióN 43H Y De SubfuncióN 10H (La SubfuncióN 00 H Es Para
- Averiguar Si Hay Un Controlador De Memoria Xms ), Este
- Procedimiento Choca Con Dificultades Al Ser Implementado En Un
- Lenguaje De Alto Nivel Teniendo Que Recurrir En Este Caso A La
- UtilizacióN Del Ensamblador.
- }
-
- Unit Mxms;
- Interface
-
- { Errores que se pueden dar en el manejo de las funciones }
-
- Const Sin_Error = $00;
- Funcion_Desconocida = $80;
- Encontrado_Vdisk = $81;
- Error_En_A20 = $82;
- Error_Del_Driver = $8E;
- Error_Irrecuperable = $8F;
- No_Hay_Hma = $90;
- No_Hay_Hma_Libre = $91;
- Poco_Hma_Libre = $92;
- Hma_Sin_Alojar = $93;
- A20_Activada = $94;
- Memoria_Agotada = $A0;
- Handles_Agotados = $A1;
- Handle_Invalido = $A2;
- Hdle_Fte_Invalido = $A3;
- Dir_Fte_No_Valida = $A4;
- Hdle_Dest_Invalido = $A5;
- Dir_Des_No_Valida = $A6;
- Longitud_Invalida = $A7;
- Solapamiento_Nulo = $A8;
- Error_De_Paridad = $A9;
-
- { Funciones del controlador XMS para el registro AX }
-
- Fobtener_Version = $0000;
- Ftamano_Xms_Libre = $0800;
- Falojar_Emb = $0900;
- Fliberar_Emb = $0A00;
- Fcopiar_Emb = $0B00;
- Fbloquear_Emb = $0C00;
- Fdesbloquear_Emb = $0D00;
- Fxms_Info = $0E00;
- Fcambiar_Tamano = $0F00;
-
- { Registro de llamadas a XMS equivalente al tipo registers }
-
- Type Txr=Record
- Ax,Bx,Dx,Si,Ds: Word
- End;
-
-
- Var Entrada : Pointer; { Puntero de entrada al controlador XMS }
- Error_Xms : Byte; { Número de error }
- Hayxms : Boolean; { Variable para averiguar si hay XMS }
-
- { Funciones de inicialización e información }
-
- Function Inicializa_Xms : Boolean;
-
- { Funciones de manejo de bloques }
-
- Function Nuevo_Bloque(Akilobytes:Integer):Integer;
- Procedure Dispon_Bloque(Handle:Integer);
- Function Cambiar_Tamano_Bloque(Handle,Nuevos_Kilobytes:Integer):Boolean;
- Procedure Mover_Bloque_Emb(Afhandle:Integer;Afoffset:Longint;
- Adhandle:Integer;Adoffset:Longint;
- Alongitud:Longint);
-
- Procedure Cantidad_Xms_Libre( Var Totalxms, Bloque_Max : Integer );
-
- Implementation
- Uses Dos;
-
- Function Inicializa_Xms : Boolean;
-
- Var R:Registers; {registro para la llamada de interrupción}
-
- Begin
- R.Ax:=$4300; { Utilización de la interrupción del multi- }
- Intr($2F,R); { plexor para averiguar si hay controlador }
- { XMS en el ordenador. }
-
- If (R.Al=$80) Then Begin { Obtención del punto de entrada a los ser- }
- R.Ax:=$4310; { vicios de XMS mediante un puntero FAR }
- Intr($2F, R);
- Entrada:=Ptr(R.Es,R.Bx);
- Error_Xms:=Sin_Error;
- Inicializa_Xms:=True;
- End
- Else
- Inicializa_Xms:=False; { No hay controlador de XMS }
- End;
-
- { Procedimiento en ensamblador para llamar a los servicios XMS }
-
- Procedure Callxms( Var Xregs : Txr );Assembler;
- Asm
- Push Ax
- Push Bx
- Push Dx
- Push Si
- Push Ds
- Push Cx
- Mov Cx,Ds
- Push Cx
- Lds Di,[Bp+6]
- Mov Ax,[Di]
- Mov Bx,[Di+2]
- Mov Dx,[Di+4]
- Mov Si,[Di+6]
- Mov Ds,[Di+8]
- Push Es
- Mov Es,Cx
- Call Es:[Entrada]
- Pop Es
- Mov Cx,Ds
- Pop Ds
- Lds Di,[Bp+6]
- Mov [Di],Ax
- Mov [Di+2],Bx
- Mov [Di+4],Dx
- Mov [Di+6],Si
- Mov [Di+8],Cx
- Pop Cx
- Pop Ds
- Pop Si
- Pop Dx
- Pop Bx
- Pop Ax
- End;
-
- { Llamada a los servicios XMS y asignación de un número de error o error 0 }
- { si no ha habido ningún error }
-
- Procedure Xmscall(Var Xregs : Txr );
- Begin
- Callxms(Xregs);
- { comprueba código de error }
-
- If (Xregs.Ax=0) And (Xregs.Bx>=128) Then Begin
- Error_Xms := Lo(Xregs.Bx) {código de error}
- End Else
- Error_Xms := Sin_Error; {no hay error }
- End;
-
- { Aloja un nuevo bloque de memoria extendida }
-
- Function Nuevo_Bloque( Akilobytes : Integer ) : Integer;
-
- Var Xr : Txr;
-
- Begin
- Xr.Ax:=Falojar_Emb; { Inicializa un bloque de memoria extendida de }
- Xr.Dx:=Akilobytes; { Akilobites Kilobytes }
- Xmscall(Xr);
- Nuevo_Bloque:=Xr.Dx { Devuelve el número de handle }
- End;
-
- { Libera un bloque de memoria extendida anteriormente alojado }
-
- Procedure Dispon_Bloque( Handle : Integer );
-
- Var Xr : Txr;
-
- Begin
- Xr.Dx:=Handle; { Libera un bloque de memoria extendida con el nú- }
- Xr.Ax:=Fliberar_Emb; { mero de handle Handle }
- Xmscall(Xr);
- End;
-
- { Mueve un bloque de memoria desde memoria extendida a convencional y vice- }
- { versa y entre memoria extendida entre sí }
-
- { Fhandle = Handle fuente EMB, si es memoria convencional será 0 }
- { Foffset = Ofset en el bloque fuente EMB, si es memoria convencional será }
- { un puntero de 32 bits al bloque fuente de memoria convencional. }
- { Dhandle = Handle destino EMB, si es memoria convencional será 0 }
- { Doffset = Ofset en el bloque destino EMB, si es memoria convencional será }
- { un puntero de 32 bits al bloque destino de memoria convencional. }
- { Longitud = Longitud en Bytes del bloque }
-
- Procedure Mover_Bloque_Emb(Afhandle:Integer;Afoffset:Longint;
- Adhandle:Integer;Adoffset:Longint;
- Alongitud:Longint);
-
- { Registro para la transferencia }
-
- Type Rxms = Record
- Tamano : Longint;
- Fhandle : Integer;
- Foffset : Longint;
- Dhandle : Integer;
- Doffset : Longint;
- End;
-
- { Variables registro para las funciones XMS }
-
- Var Xr : Txr;
- Mstruct : Rxms;
-
- Begin
- With Mstruct Do
- Begin
- Tamano:=Alongitud;
- Fhandle:=Afhandle;
- Foffset:=Afoffset;
- Dhandle:=Adhandle;
- Doffset:=Adoffset;
- End;
- Xr.Si:=Ofs(Mstruct);
- Xr.Ds:=Seg(Mstruct);
- Xr.Ax:=Fcopiar_Emb;
- Xmscall(Xr);
- End;
-
- { Cambia el tamaño de un bloque de EMB }
- { Nuevos_Kilobytes = nuevo tamaño en Kilobytes }
-
- Function Cambiar_Tamano_Bloque( Handle, Nuevos_Kilobytes : Integer ) : Boolean;
-
- Var Xr : Txr;
-
- Begin
- Xr.Dx:=Handle;
- Xr.Bx:=Nuevos_Kilobytes;
- Xr.Ax:=Fcambiar_Tamano;
- Xmscall( Xr );
- Cambiar_Tamano_Bloque:=(Error_Xms=Sin_Error); { Ha habido error o no }
- End;
-
- Procedure Cantidad_Xms_Libre( Var Totalxms, Bloque_Max : Integer );
-
- Var Xr : Txr;
-
- Begin
- Xr.Ax:=Ftamano_Xms_Libre;
- Xmscall(Xr);
- Totalxms:=Xr.Ax; { Tamaño total memoria extendida libre }
- Bloque_Max:=Xr.Dx; { Tamaño del bloque mas grande de memoria }
- End; { extendida libre }
-
- { Procedimiento de inicialización }
-
- Begin
- Hayxms:=Inicializa_Xms;
- End.
-